<?php
namespace common;

use framework\view;
use framework\core\Context;
use framework\exception\NewException;
use framework\driver\mysql;
use framework\driver\redis;

class Utils
{
    /**
     * 合并路径
     *
     * @return string
     */
    public static function mergePath()
    {
        return implode(DIRECTORY_SEPARATOR, func_get_args());
    }

    /**
     * 从数组中获取一个随机成员
     *
     * @param array $items
     * @return mixed
     */
    public static function getRandomItem($items)
    {
        return $items[array_rand($items)];
    }

    /**
     * 按权重获取类型
     *
     * @param array $weights [type => weight]
     * @return int
     */
    public static function getWeightItem($weights)
    {
        $randValue  = rand(1, array_sum($weights));
        $limitValue = 0;

        foreach ($weights as $type => $weight)
        {
            $limitValue += $weight;

            if ($randValue <= $limitValue)
            {
                return $type;
            }
        }

        return 0;
    }

    /**
     * 解析信息字符串
     *
     * @param string $string
     * @return array
     */
    public static function parseInfoStr($string)
    {
        return (trim($string) == '') ? array() : array_map(function ($piece)
        {
            return array_map('intval', explode(',', $piece));

        }, array_filter(explode(';', $string)));
    }

    /**
     * 获取客户端IP
     *
     * @return string
     */
    public static function getClientIP()
    {
        if (isset($_SERVER))
        {
            $realip = $_SERVER["REMOTE_ADDR"];
        }
        else
        {
            $realip = getenv("REMOTE_ADDR");
        }

        return addslashes($realip);
    }

    /**
     * 判断IP是否在列表中
     *
     * @param string $ip
     * @param array  $ipList
     * @return boolean
     */
    public static function inIpList($ip, $ipList)
    {
        $bRange = implode('.', array_slice(explode('.', $ip), 0, 2)) . '.*.*';
        $cRange = implode('.', array_slice(explode('.', $ip), 0, 3)) . '.*';

        if (in_array($ip, $ipList) || in_array($bRange, $ipList) || in_array($cRange, $ipList))
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }

    /**
     * 格式化字符串
     *
     * @param string $string
     * @param array  $params
     * @return string
     */
    public static function formatStr($string, $params)
    {
        return preg_replace(
            array_map(
                function ($key)
                {
                    return '/\{' . $key . '\}/';
                },
                array_keys($params)
            ),
            array_values($params),
            $string
        );
    }

    /**
     * 初始化配置
     *
     */
    public static function initConfig()
    {
        // 调试模式设置
        ini_set('display_errors', DEBUG_MODE ? 'On' : 'Off');

        // 时区设置
        date_default_timezone_set(TIME_ZONE);

        // 当前时间和日期
        $GLOBALS['NOW_TIME'] = time();
        $GLOBALS['NOW_DATE'] = date('Y-m-d H:i:s', $GLOBALS['NOW_TIME']);

        // 设置Session散列，启动Session
        ini_set('session.save_path', '2;/tmp/phpsession_' . PROJECT_NAME . '/');
        session_start();

        // 初始化模板配置
        view\TemplateView::setConfig(TEMPLATE_TEMPLATE_PATH, TEMPLATE_COMPILE_PATH);

        // 初始化 Redis 配置
        $redisConfig = new redis\Config(REDIS_HOST, REDIS_PORT, REDIS_INDEX_CACHE);
        redis\Manager::addConfig(REDIS_INDEX_CACHE, $redisConfig);

        // 初始化数据库配置
        $pdoConfig = new mysql\Config(DB_HOST, DB_PORT, DB_LIBR, DB_USER, DB_PASS, DEFAULT_CHARSET);
        mysql\Manager::addConfig($pdoConfig);
    }
}